home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 26 / AACD 26.iso / AACD / Programming / AllPlaton / Gamedisk3 / Crackout! / CrackOut!.AMOS / CrackOut!.amosSourceCode
Encoding:
AMOS Source Code  |  1993-06-02  |  36.6 KB  |  1,182 lines

  1. Hide 
  2. Dim F(41,12)
  3. Dim SC(100),NAM$(100),C(15)
  4. Global F(),SO,MU,SC,LI,LE,LEV,SPB,PAL,MEM,MV,SV,BSP,KSC,EX,RETEND,I$
  5. If Chip Free+Fast Free>512000 Then MEM=1 Else MEM=0
  6. TITLE
  7. MU=1 : SO=1 : SC=0 : LEV=1 : PAL=1 : MV=63 : SV=63 : BSP=4 : RETEND=0
  8. Load "InGameGraphics.dat",9
  9. Repeat 
  10.   HISCORE : P=Param
  11.   If P=0
  12.     Do 
  13.       MAIN
  14.       If Param>0
  15.         ENGAME[Param]
  16.         If Param=0 : Exit : End If 
  17.       Else 
  18.         Exit 
  19.       End If 
  20.     Loop 
  21.   End If 
  22.   If P=2 Then LEVELEDIT
  23. Until P=1
  24. Erase 3 : Erase 9 : Erase 14
  25. End 
  26. Procedure TITLE
  27.   If Mouse Key Then Pop Proc
  28.   If MEM
  29.     Load "RamFound.pic",9
  30.     Unpack 9 To 1 : Screen Hide 1
  31.     Gr Writing 0 : Ink 12
  32.     A$=Str$(Chip Free/1024)-" "+" KB FREE CHIP-RAM DETECTED!"
  33.     If Fast Free
  34.       B$=Str$(Fast Free/1024)-" "+" KB FREE "
  35.       Reserve As Work 16,8 : A=Start(16) : Erase 16
  36.       If A<$C00000 : B$=B$+"FAST" : Else B$=B$+"RANGER" : End If 
  37.       B$=B$+"-RAM DETECTED!"
  38.       Text 160-Len(A$)*4,246,A$
  39.       Text 160-Len(B$)*4,254,B$
  40.     Else 
  41.       Text 160-Len(A$)*4,254,A$
  42.     End If 
  43.     Screen Open 0,320,256,16,0
  44.     Curs Off : Flash Off : Paper 0 : Pen 1 : Cls 
  45.     For A=0 To 15 : Colour A,0 : Next 
  46.     Fade 5 To 1
  47.     Appear 1 To 0,67
  48.   End If 
  49.   Load "Title.dat"
  50.   Screen Open 1,16,16,2,0 : Screen Hide 1
  51.   No Icon Mask 
  52.   Dim ST1(17,1),ST2(11,1),R(53),COR(53,1)
  53.   Restore 
  54.   For A=0 To 17
  55.     Read ST1(A,0),ST1(A,1)
  56.   Next 
  57.   For A=0 To 11
  58.     Read ST2(A,0),ST2(A,1)
  59.   Next 
  60.   If MEM Then Load "Title.mus",3
  61.   Load "Title.pic",9
  62.   Load "End.sam",5
  63.   Sam Bank 5
  64.   If MEM=0 Then Goto NOMEM
  65.   For A=248 To 8 Step -8
  66.     Screen Offset 0,0,256-A
  67.     Screen Display 0,,,,A
  68.     Wait Vbl 
  69.   Next 
  70.   Screen Close 0
  71.   Unpack 9 To 0 : Erase 9
  72.   Screen Display 0,128,40,320,0
  73.   Double Buffer 
  74.   Screen 1 : Get Palette 0 : Screen 0
  75.   For A=0 To 31 : Colour A,0 : Next 
  76.   Fade 3 To 1
  77.   For A=1 To 32
  78.     Screen Offset 0,0,256-A*8
  79.     Screen Display 0,128,40,320,A*8
  80.     If A=25 Then Sam Play 1,1,9000
  81.     Wait Vbl 
  82.   Next 
  83.   Wait 2
  84.   A$="L X=328; F R0=0 To 19; L X=X-16; N R0; "
  85.   Bob 0,328,0,2
  86.   Channel 0 To Bob 0
  87.   Amal 0,A$
  88.   Amal On 
  89.   Repeat : Wait Vbl : Until Amreg(0,0)>9
  90.   For A=0 To 31 : Colour A,$FFF : Next 
  91.   Sam Play 2,2,9000
  92.   Repeat : Wait Vbl : Until Amreg(0,0)=20
  93.   Paste Icon 142,70,1
  94.   Bob 0,8,0, : Wait Vbl 
  95.   Put Bob 0 : Wait Vbl 
  96.   Bob Off 0
  97.   Fade 3 To 1
  98.   For A=0 To 5
  99.     B1$=Str$(13+A*4)-" "
  100.     B2$=Str$(14+A*4)-" "
  101.     B3$=Str$(15+A*4)-" "
  102.     B4$=Str$(16+A*4)-" "
  103.     A$="A: L X=R0; L Y=R1; A 1,("+B1$+",3)"
  104.     A$=A$+"("+B2$+",3)("+B3$+",3)"
  105.     A$=A$+"("+B4$+",6)("+B3$+",3)"
  106.     A$=A$+"("+B2$+",3)("+B1$+",3)"
  107.     A$=A$+"(1,1); F R2=0 T 15; P; N R2; J A;"
  108.     Bob 1+A,-10,-10,1
  109.     Channel A To Bob 1+A
  110.     Amal A,A$
  111.     Amreg(A,0)=-10 : Amreg(A,1)=-10
  112.     Amal On A : Wait Vbl 
  113.   Next 
  114.   A$="A: L X=R0; L Y=R1; A 1,(3,1)(4,1)(5,2)(6,2)(7,2)(8,2)"
  115.   A$=A$+"(9,2)(10,2)(11,2)(12,8)(11,2)(10,2)(9,2)(8,2)(7,2)"
  116.   A$=A$+"(6,2)(5,2)(4,1)(3,1); F R2=1 T 22; P; N R2; J A;"
  117.   For A=6 To 8
  118.     Bob 1+A,-10,-10,1
  119.     Channel A To Bob 1+A
  120.     Amal A,String$("P",(A-6)*4)+"; "+A$
  121.     Amreg(A,0)=-10 : Amreg(A,1)=-10
  122.     Amal On A
  123.   Next 
  124.   Music 1 : Tempo 16 : Mvolume 0
  125.   MV=0 : Screen Close 1
  126.   Repeat 
  127.     Mvolume MV : MV=Min(MV+1,63)
  128.     Add C1,1,0 To 5
  129.     B=Rnd(17) : Amreg(C1,0)=ST1(B,0)-4 : Amreg(C1,1)=ST1(B,1)-4
  130.     Add C2,1,6 To 8
  131.     B=Rnd(11) : Amreg(C2,0)=ST2(B,0)-8 : Amreg(C2,1)=ST2(B,1)-8
  132.     Wait Vbl 
  133.   Until Mouse Key
  134.   Amal Off : For A=2 To 9 : Bob Off A : Next 
  135.   Fade 3 : For A=1 To 48 : MV=Min(MV+1,63) : Mvolume MV : Wait Vbl : Next 
  136.   Bob Off 
  137. RTSNOMEM:
  138.   Repeat : MV=Min(MV+2,63) : Mvolume MV : Wait Vbl : Until MV=63
  139.   A$="L R1=1; Anim 1,(44,3)(43,3)(42,3)(41,3)(40,3)(39,3); "
  140.   Screen Close 0
  141.   Screen Open 1,320,100,8,0
  142.   Curs Off : Flash Off : Cls 0
  143.   Palette 0,$FFF,$AAA,$777,0,$8CF,$48C,$248
  144.   For B=1 To 3 : For A=0 To 3 : Colour 16+A*4+B,Colour(B) : Next : Next 
  145.   For A=0 To 3
  146.     Sprite A*2,-10,-10,43
  147.     Channel A To Sprite A*2
  148.   Next 
  149.   For A=1 To 53
  150.     Read R(A)
  151.   Next 
  152.   For A=1 To 53
  153.     Read COR(A,0),COR(A,1)
  154.   Next 
  155.   Load "Title.sam",5
  156.   Sam Bank 5
  157.   B=0 : S=1
  158.   For A=1 To 53
  159.     For C=0 To 3
  160.       If Chanan(C)=0 Then Paste Bob X Sprite(C*2)-144,Y Sprite(C*2)-66,39
  161.     Next 
  162.     X=COR(R(A),0)+30
  163.     Y=COR(R(A),1)+20
  164.     Wait Vbl : Sprite B*2,X+128,Y+40,44
  165.     Sam Play 2,2,27000
  166.     Amal B,A$ : Amal On B : Wait 4
  167.     Add B,1,0 To 3
  168.     If Mouse Key Then Gosub FAST : Goto SKIP
  169.   Next 
  170.   D=0
  171.   Wait 20
  172.   For C=0 To 3
  173.     Paste Bob X Sprite(C*2)-144,Y Sprite(C*2)-66,39
  174.   Next 
  175.   Sprite Off 
  176.   For A=0 To 7
  177.     Sprite A,-10,-10,43
  178.     Channel A To Sprite A
  179.     Amal A,"L R1=1;" : Amal On A
  180.   Next 
  181.   For A=1 To 36
  182.     Read COR(A,0),COR(A,1)
  183.     COR(A,0)=COR(A,0)*4+180
  184.     COR(A,1)=(COR(A,1)-34)*8+50
  185.   Next 
  186.   A$="L R1=0; A: P; L X=X-4; I X<R0 Jump B; Jump A; B: P; L R1=1; "
  187.   For B=0 To 3 : For A=0 To 3 : Colour 16+A*4+B,Colour(B+4) : Next : Next 
  188.   A=1 : S=2
  189.   Repeat 
  190.     For B=0 To 7
  191.       If Amreg(B,1)=1
  192.         If A>8
  193.           Sam Play 2,1,17000
  194.           Paste Bob X Sprite(B)-128,Y Sprite(B)-50,38
  195.         End If 
  196.         If A<37
  197.           Sprite B,448,COR(A,1)+50,37
  198.           Amal B,A$ : Amal On B : Amreg(B,0)=COR(A,0)+128
  199.         Else 
  200.           Amreg(B,1)=2
  201.         End If 
  202.         Inc A
  203.       End If 
  204.       If Mouse Key Then Gosub FAST : Goto SKIP
  205.       Wait Vbl 
  206.     Next 
  207.   Until A>44
  208.   Wait 5 : Erase 5
  209.   Amal Off : Sprite Off 
  210. SKIP:
  211.   Screen Open 0,320,240,2,0
  212.   Curs Off : Flash Off : Cls 0
  213.   Screen Display 0,128,150,320,120
  214.   EX=0 : Y=128
  215.   Set Rainbow 0,1,124,"","",""
  216.   For A=0 To 7
  217.     Rain(0,A)=A*$222
  218.   Next 
  219.   For A=8 To 112
  220.     Rain(0,A)=$FFF
  221.   Next 
  222.   For A=113 To 120
  223.     Rain(0,A)=(120-A)*$222
  224.   Next 
  225.   Rainbow 0,0,149,124
  226.   MO=1
  227.   Do 
  228.     If MO=1
  229.       A$="welcome to" : Gosub PTEX : Add Y,8
  230.       A$="crack out!" : Gosub PTEX : Add Y,24
  231.       A$="written using amos" : Gosub PTEX
  232.     End If 
  233.     If MO=2
  234.       A$="idea graphics levels" : Gosub PTEX : Add Y,4
  235.       A$="by h. p. obermeier" : Gosub PTEX : Add Y,12
  236.       A$="program music sound" : Gosub PTEX
  237.       A$="additonal graphics" : Gosub PTEX : Add Y,4
  238.       A$="by c. hodges" : Gosub PTEX
  239.     End If 
  240.     If MO=3
  241.       A$="version 1.3" : Gosub PTEX : Add Y,4
  242.       A$="03/10/1992" : Gosub PTEX : Add Y,32
  243.       A$="copyright 1992" : Gosub PTEX : Add Y,4
  244.       A$="hans peter obermeier" : Gosub PTEX
  245.     End If 
  246.     If MO=4
  247.       Add Y,16 : A$="enjoy the game!" : Gosub PTEX : Add Y,32
  248.       A$="press mouse button" : Gosub PTEX
  249.       A$="to load main part!" : Gosub PTEX
  250.     End If 
  251.     If MO=5
  252.       Add Y,16 : A$="there is also" : Gosub PTEX : Add Y,8
  253.       A$="a cheat mode," : Gosub PTEX : Add Y,16
  254.       A$="find it out!" : Gosub PTEX
  255.     End If 
  256.     If MO=6
  257.       A$="warning!" : Gosub PTEX : Add Y,24
  258.       A$="do not use any" : Gosub PTEX : Add Y,8
  259.       A$="freezers!" : Gosub PTEX
  260.     End If 
  261.     Gosub SCROL : Gosub WAI
  262.     If EX Then Exit 
  263.     Add MO,1,1 To 6
  264.   Loop 
  265.   Screen 1 : Fade 3 : Screen 0
  266.   Ink 0 : Bar 0,120 To 320,240
  267.   EX=0 : Gosub SCROL : Wait Vbl : Rainbow Del 
  268.   For A=63 To 0 Step -1 : Mvolume A : Wait Vbl : Next 
  269.   Screen Close 1
  270.   Music Off : Screen Close 0
  271.   Erase 1 : Erase 2 : Erase 3
  272. Pop Proc
  273. NOMEM:
  274.   Unpack 9 To 0 : Erase 9
  275.   Screen Display 0,128,40,320,0
  276.   Screen 1 : Get Palette 0 : Screen 0
  277.   For A=0 To 31 : Colour A,0 : Next : Wait 2
  278.   Fade 3 To 1
  279.   Load "End.sam",5
  280.   Sam Bank 5
  281.   Sam Play 1,1,9000
  282.   For A=1 To 32
  283.     Screen Offset 0,0,256-A*8
  284.     Screen Display 0,128,40,320,A*8
  285.     Wait Vbl 
  286.   Next 
  287.   For A=1 To 31 : Colour A,$FFF : Next : Wait 2
  288.   Sam Play 2,2,9000
  289.   Paste Bob 8,0,2
  290.   Paste Icon 142,70,1
  291.   Get Bob 2,0,0 To 1,1
  292.   Fade 3 To 1 : Wait 44 : Erase 5
  293.   Load "Title.mus",3
  294.   MV=0 : Music 1 : Tempo 16 : Mvolume 0
  295.   Repeat 
  296.     MV=Min(MV+1,63) : Mvolume MV : Wait Vbl 
  297.   Until Mouse Key
  298.   Fade 3 : Wait 48
  299. Goto RTSNOMEM
  300. FAST:
  301.   Amal Off : Wait Vbl : Sprite Off 
  302.   If S=2 Then Goto SKIP2
  303.   For A=1 To 53
  304.     Paste Bob COR(R(A),0)+14,COR(R(A),1)-6,39
  305.   Next 
  306.   For A=1 To 36
  307.     Read COR(A,0),COR(A,1)
  308.     COR(A,0)=COR(A,0)*4+180
  309.     COR(A,1)=(COR(A,1)-34)*8+50
  310.   Next 
  311. SKIP2:
  312.   For A=1 To 36
  313.     Paste Bob COR(A,0),COR(A,1),38
  314.   Next 
  315.   Wait Vbl : Erase 5
  316. Return 
  317. WAI:
  318.   For A=1 To 150
  319.     If Mouse Key Then EX=1 : Exit 
  320.     Wait Vbl 
  321.   Next 
  322. Return 
  323. SCROL:
  324.   If EX Then Return 
  325.   Y=128
  326.   For A=0 To 120 Step 8
  327.     Screen Offset 0,0,A : Wait Vbl 
  328.     If Mouse Key Then EX=1
  329.   Next 
  330.   Screen Copy 0,0,120,320,240 To 0,0,0
  331.   Screen Offset 0,0,0 : Wait 2
  332.   Ink 0 : Bar 0,120 To 320,240
  333. Return 
  334. PTEX:
  335.   X=160-Len(A$)*8
  336.   For A=1 To Len(A$)
  337.     Paste Icon X,Y,Asc(Mid$(Upper$(A$),A,1))-30
  338.     Add X,16
  339.   Next 
  340.   Add Y,16
  341. Return 
  342. Data 56,4,9,17,54,51,90,7,124,14,106,71,128,19,162,10,228,5,196,9
  343. Data 219,50,230,59,260,7,298,11,295,65,252,65,140,69,174,65
  344. Data 172,76,218,72,256,71,268,71,308,72,267,107,237,102,204,95,162,97
  345. Data 153,122,200,123,289,70
  346. ' CRACK data 
  347. Data 4,8,16,45,20,35,22,25,48,32,1,53,30,40,37,34,44,9,52,27,13,15,31
  348. Data 2,6,49,50,33,10,21,46,38,23,29,42,14,3,11,24,36,41
  349. Data 51,5,12,26,39,7,17,28,43,18,47,19
  350. ' CRACK 53 
  351. Data 4,0,12,0,20,0,36,0,44,0,52,0,76,0,84,0,92,0,116,0
  352. Data 124,0,132,0,148,0,170,0,0,8,36,8,56,8,72,8,96,8,112,8
  353. Data 148,8,164,8,0,16,36,16,44,16,52,16,72,16,80,16,88,16,96,16
  354. Data 112,16,148,16,158,16,0,24,36,24,56,24,72,24,96,24,112,24,148,24
  355. Data 164,24,4,32,12,32,20,32,36,32,56,32,72,32,96,32,116,32,124,32
  356. Data 132,32,148,32,170,32
  357. ' OUT 33 
  358. Data 1,34,3,34,5,34,10,34,16,34,20,34,22,34,24,34,26,34
  359. Data 1,39,3,39,5,39,11,39,13,39,15,39,23,39
  360. Data 0,35,6,35,10,35,16,35,23,35
  361. Data 0,37,6,37,10,37,16,37,23,37
  362. Data 0,38,6,38,10,38,16,38,23,38
  363. Data 0,36,6,36,10,36,16,36,23,36
  364. End Proc
  365. Procedure HISCORE
  366.   Shared SC(),NAM$()
  367.   LI=5 : RETEND=0
  368.   Load "Hiscores.dat",0
  369.   Gosub LEAHISCR
  370.   Gosub INITMAINSCR
  371.   Gosub INITHISCR
  372.   MUS=0
  373.   If RANK<101 and MU=1 Then MUS=2 : If Length(14) Then Bank Swap 3,14 Else Load "InHiscore.mus",3
  374.   If RANK>100 and MU=1 Then MUS=1 : If Length(3)=0 Then Load "InGame.mus",3
  375.   Gosub INITRAIN
  376.   Gosub INITLINESCR
  377.   Gosub INITSTARS
  378.   If MU=1 Then Music 1
  379.   M=63 : Volume M
  380.   Screen 1 : Colour 18,$444 : Colour 22,$888 : Colour 26,$BBB : Colour 30,$FFF
  381.   A=0 : SPR=1 : If RANK>100 Then Goto SKIP
  382.   Screen 0 : Fade 1 : Bob Off : Wait Vbl 
  383.   Cls : Locate 1,4 : Centre "Well done!!!"
  384.   Print : Print : Centre "You are one"
  385.   Print : Print : Centre "of the Best!!!"
  386.   Print : Print : Centre "Please Enter Your Name"
  387.   Print : Print : Print : Print "     RANK       NAME        SCORE";
  388.   Fade 2,0,$48F,$36C,$248 : Colour 18,$444 : Colour 22,$888 : Colour 26,$BBB : Colour 30,$FFF
  389.   SC(RANK)=SC : NAM$(RANK)="                "
  390.   X=RANK+12
  391.   Screen 1 : Locate 10,X : Print "..............." : Locate 27,X
  392.   Print String$("0",8-Len(Str$(SC(RANK))));
  393.   Print Mid$(Str$(SC(RANK)),2)
  394.   A=0 : B=RANK*8+50 : S=4
  395.   Repeat 
  396.     Add A,S : Wait Vbl : Screen Offset 1,,A : Rainbow 1,A/2,139,102
  397.     Amreg(SPR,1)=Rnd(180)+50 : Add SPR,1,1 To 7 : M=Max(10,63-(A/30)) : Mvolume M
  398.     If B-A<41 Then S=3
  399.     If B-A<21 Then S=2
  400.     If B-A<11 Then S=1
  401.   Until B=A
  402.   Add A,-S : B=0 : A$=""
  403.   Do 
  404.     I$=Upper$(Inkey$)
  405.     If Asc(I$)>31 and Asc(I$)<91 and B<15 Then Inc B : A$=A$+I$
  406.     If Asc(I$)=8 and B>0 Then Dec B : A$=Left$(A$,B)
  407.     If Asc(I$)=13 Then Exit 
  408.     Amreg(SPR,1)=Rnd(180)+50 : Add SPR,1,1 To 7
  409.     Wait Vbl : Locate 10,X : Print A$; : If B=15 Then Print " "; Else Print "-";
  410.     If B<14 Then Print ".";
  411.     If Flip$(A$)="DAB SI GNITAEHC"
  412.       Screen 0 : Cls : Locate 1,4 : Centre Flip$("!dab si gnitaehc ,seY")
  413.       Print : Print : Centre "But it is the only way"
  414.       Print : Print : Centre "To get futher than the"
  415.       Print : Print : Centre "First 10 levels!"
  416.       Print : Print : Print : Print "     RANK       NAME        SCORE";
  417.       Screen 1
  418.       LI=150
  419.       A$="YES THATS RIGHT" : CHET=1 : CLEV=1
  420.     End If 
  421.     If Flip$(Left$(A$,13))=" LEVEL TNAW I" and B=15 and CHET=1
  422.       CLEV=Min(50,Max(1,Val(Right$(A$,2))))
  423.       If CLEV<10 : B$="0" : Else B$="" : End If 
  424.       A$="OKEY, DOKEY! "+B$+(Str$(CLEV)-" ")
  425.     End If 
  426.   Loop 
  427.   If A$="" Then A$="!! MR RETURN !!" : B=15
  428.   NAM$=A$ : If B<15 Then For C=B To 14 : NAM$=NAM$+" " : Next 
  429.   NAM$(RANK)=NAM$
  430.   Locate 10,X : Print NAM$; : Screen 0 : Fade 1 : Wait 16
  431.   Cls : Home 
  432.   Gosub INITMAINSCR2
  433. SKIP:
  434.   Screen 0 : Fade 2,0,$38F,$36C,$248 : Colour 18,$444 : Colour 22,$888 : Colour 26,$BBB : Colour 30,$FFF
  435.   Screen 2
  436.   B=400 : C=1 : EN=0
  437.   Repeat : Add A,1,0 To 904 : Screen Offset 1,,A : Rainbow 1,A/2,139,102 : Wait Vbl 
  438.     Amreg(SPR,1)=Rnd(180)+50 : Add SPR,1,1 To 7 : Add B,1,0 To 449 : M=Min(M+1,63) : Mvolume M
  439.     If B=0 Then Fade 5,0,$FFF,0,$FFF,0,$FFF,0,$FFF
  440.     If B=150 Then Fade 5,0,0,$FF0,$FF0,0,0,$FF0,$FF0
  441.     If B=300 Then Fade 5,0,0,0,0,$FF,$FF,$FF,$FF
  442.     I$=Inkey$ : S=Scancode : If S Then Gosub KEYS
  443.   Until EN<>0 or Mouse Key
  444.   For C=1 To 7 : Amreg(C,1)=0 : Next 
  445.   Screen 2 : Fade 1 : Screen 0
  446.   E=Min(A/2+102,503)
  447.   For B=15 To 0 Step -1
  448.     If B=8 Then Fade 2
  449.     For C=A/2 To E
  450.       D=Rain(1,C) : Rain(1,C)=Max((D and 3840)-256,0)+Max((D and 240)-16,0)+Max((D and 15)-1,0)
  451.     Next 
  452.     View : Wait Vbl 
  453.   Next 
  454.   If CHET=1 Then LEV=CLEV
  455.   Amal Off : Wait Vbl : Sprite Off : Bob Off : Wait Vbl 
  456.   Screen Close 0 : Screen Close 1 : Rainbow Del : Screen Close 2
  457.   For A=M To 0 Step -1 : Wait Vbl : Mvolume A : Next : Music Off 
  458.   If MUS=2 and MEM=0 Then Erase 3
  459.   If MUS=2 and MEM=1 Then Bank Swap 3,14
  460.   Poke $BFD100,$7D : Poke $BFD100,$75 : P=Peek($BFE001)
  461.   If(P and 12)=12 and RANK<101 Then Gosub SAVHISCR
  462.   Erase 1
  463.   If EN=0
  464.   End If 
  465.   If EN=0 and LEV<51 and CHET=0 Then ENTACCESSCODE
  466.   If EN=0 or EN=2 Then Goto EXIPROC
  467.   Screen Open 0,320,9,2,0
  468.   Curs Off : Cls 0 : Centre "   Thanx for Playing..."
  469.   Palette 0,0 : Screen Display 0,,140,,
  470.   Fade 2,0,$FFF : Wait 250 : Fade 2 : Wait 32 : Screen Close 0
  471.   Goto EXIPROC
  472. End 
  473. KEYS:
  474.   If S=80 Then Gosub MUSONOFF
  475.   If I$=Chr$(27) Then EN=1
  476.   If S=81 Then Gosub SOUONOFF
  477.   If S=82 Then Gosub LEVELS
  478.   If S=83 Then EN=2
  479. Return 
  480. LEVELS:
  481.   If LEV<51 Then LEV=51 : S$="Editor" Else LEV=1 : S$="Normal"
  482.   Screen 0 : Locate 8,10 : Print S$ : Screen 2
  483. Return 
  484. MUSONOFF:
  485.   If MU=0 Then MU=1 : M$="on!" Else MU=0 : M$="off"
  486.   Screen 0 : Locate 14,9 : Print M$ : Screen 2
  487. Return 
  488. SOUONOFF:
  489.   If SO=0 Then SO=1 : S$="on!" Else SO=0 : S$="off"
  490.   Screen 0 : Locate 31,9 : Print S$ : Screen 2
  491. Return 
  492. INITLINESCR:
  493.   Screen Open 2,320,9,8,Lowres
  494.   Curs Off : Flash Off : Cls 0 : Paper 0
  495.   Palette 0,0,0,0,0,0,0,0 : Screen Display 2,,241,,9
  496.   Writing 1
  497.   Pen 1 : Centre "Welcome to Crack out!!!!"
  498.   Pen 2 : Centre "A Game by H. P. Obermeier and C. Hodges"
  499.   Pen 4 : Centre "Press Button to Start"
  500.   Writing 0
  501. Return 
  502. LEAHISCR:
  503.   Open In 1,"Hisc.dat"
  504.     For A=1 To 100
  505.       NAM$(A)=Input$(1,15)
  506.       A$=Input$(1,4)
  507.       SC(A)=Leek(Varptr(A$))
  508.     Next 
  509.   Close 1
  510. Return 
  511. SAVHISCR:
  512.   Open Out 1,"Hisc.dat"
  513.     For A=1 To 100
  514.       B=Varptr(SC(A))
  515.       Print #1,NAM$(A)+Chr$(0)+Chr$(Peek(B+1))+Chr$(Peek(B+2))+Chr$(Peek(B+3));
  516.     Next 
  517.   Close 1
  518. Return 
  519. INITHISCR:
  520.   Screen Open 1,320,1009,2,Lowres
  521.   Flash Off : Curs Off : Cls 0 : Palette 0,$8FF
  522.   Screen Display 1,,140,,100 : RANK=101
  523.   For A=100 To 1 Step -1
  524.     If SC(A)<SC Then RANK=A : SC(A)=SC(A-1) : NAM$(A)=NAM$(A-1)
  525.     Locate 5,A+12 : Print A : Locate 10,A+12 : Print NAM$(A) : Locate 27,A+12
  526.     Print String$("0",8-Len(Str$(SC(A))));
  527.     Print Mid$(Str$(SC(A)),2)
  528.   Next 
  529. Return 
  530. INITMAINSCR:
  531.   Screen Open 0,320,105,4,Lowres
  532.   Flash Off : Paper 0 : Pen 1 : Curs Off : Cls 0
  533.   Screen Display 0,128,36,,
  534.   Palette 0,0,0,0
  535. INITMAINSCR2:
  536.   Bob 1,85,0,5 : Locate 1,8
  537.   If MU=0 Then M$="off" Else M$="on!"
  538.   If SO=0 Then S$="off" Else S$="on!"
  539.   Print : Centre "F1 Music "+M$+"     F2 Sound "+S$
  540.   If LEV<51 Then M$="Normal" : LEV=1 Else M$="Editor" : LEV=51
  541.   Print : Centre "F3 "+M$+" Levels F4 Editor   "
  542.   Print : Print : Print "     RANK       NAME        SCORE";
  543. Return 
  544. INITRAIN:
  545.   Set Rainbow 1,1,504,"","",""
  546.   R=60 : B=60 : G=30 : RS=-1 : GS=-4 : BS=-3
  547.   For A=0 To 503
  548.     Rain(1,A)=((R/4)*256)+((G/4)*16)+(B/4)
  549.     Add R,RS : Add G,GS : Add B,BS
  550.     If R<0 Then R=0 : RS=3
  551.     If R>60 Then R=60 : RS=-1
  552.     If G<0 Then G=0 : GS=4
  553.     If G>60 Then G=60 : GS=-2
  554.     If B<0 Then B=0 : BS=1
  555.     If B>60 Then B=60 : BS=-4
  556.   Next 
  557. Return 
  558. INITSTARS:
  559.   Autoback 0
  560.   A$="A: P; L X=X-R0; I X<110 J N; J A; N: L X=488; L Y=R1; J A; "
  561.   For A=1 To 7
  562.     Sprite A,Rnd(352)+112,Rnd(200)+40,1
  563.     Channel A To Sprite A : Amal A,A$
  564.   Next 
  565.   For A=1 To 7
  566.     Sprite A,Rnd(320)+128,Rnd(180)+50,4-(A+1)/3.5
  567.   Next 
  568.   Wait Vbl : Amal On 
  569.   For A=1 To 7 : Amreg(A,0)=(A+3)/1.4 : Amreg(A,1)=Rnd(180)+50 : Next 
  570. Return 
  571. EXIPROC:
  572. End Proc[EN]
  573. Procedure LEVELEDIT
  574.   Shared C()
  575.   Unpack 9 To 0
  576.   Screen Hide 0
  577.   For X=0 To 17
  578.     Get Cblock X+1,X*8,0,8,16
  579.   Next 
  580.   For A=0 To 15 : C(A)=Colour(A) : Next 
  581.   Screen Open 1,320,16,16,Lowres
  582.   Paper 0 : Flash Off : Curs Off : Cls : Palette 0,$FFF
  583.   For A=0 To 15 : Colour A,0 : Next 
  584.   FL$="(FFF,2)(EEE,2)(DDD,2)(CCC,2)(BBB,2)(AAA,2)(999,2)(888,2)(999,2)(AAA,2)(BBB,2)(CCC,2)(DDD,2)(EEE,2)"
  585.   Wait Vbl : Flash 17,FL$
  586.   Wait Vbl : Flash 18,FL$
  587.   Wait Vbl : Flash 19,FL$
  588.   For A=1 To 18 : Put Cblock A,A*8-8,0 : Next 
  589.   LEV=51 : LL=50 : LE=51
  590.   Locate 19,0 : Print "LO SA +-  LEVEL:";LE;" ";
  591.   Locate 19,1 : Print "AD VE";
  592.   Screen Open 0,320,192,16,Lowres
  593.   Curs Off : Paper 0 : Flash Off : Cls 0
  594.   Screen Display 0,128,67,320,192
  595.   For A=0 To 15 : Colour A,C(A) : Next 
  596.   Screen 1 : Fade 3 To 0 : Screen 0
  597.   For X=0 To 39
  598.     For Y=0 To 11
  599.       F(X,Y)=0
  600.       Put Cblock F(X,Y)+1,X*8,Y*16
  601.     Next 
  602.   Next 
  603.   A=6 : X=1 : Gosub CHGBLOCK
  604.   Wait Vbl : Flash 17,FL$
  605.   Wait Vbl : Flash 18,FL$
  606.   Wait Vbl : Flash 19,FL$
  607.   Limit Mouse 128,50 To 447,258
  608.   Change Mouse 2
  609.   Show On : Screen 0 : CHG=0
  610.   Do 
  611.     M=Mouse Key : X=(X Mouse-129)/8 : Y=Y Screen(Mouse Screen,Y Mouse-1)/16
  612.     If Mouse Screen=1 and M and A<>X Then Gosub CHGBLOCK : M=0
  613.     If Mouse Screen=0 and M=1 Then CHG=1 : F(X,Y)=A : Put Cblock A+1,X*8,Y*16
  614.     If Mouse Screen=0 and M=2 Then CHG=1 : F(X,Y)=0 : Put Cblock 1,X*8,Y*16
  615.     EX=(Inkey$=Chr$(27))
  616.     If EX and CHG Then ALERT["Level not saved!","Quit out!","Sorry man!"] : If Param=1 Then CHG=0 Else Gosub BLITZ
  617.     If EX and CHG=0 Then Exit 
  618.   Loop 
  619.   Hide On 
  620.   Screen 1 : Fade 4 : Screen 0 : Ink 0
  621.   For B=0 To 9
  622.     For A=0 To 31 : Draw A*10+B,0 To A*10+B,192 : Next 
  623.     Wait Vbl 
  624.   Next 
  625.   Screen Close 1 : Screen Close 0
  626.   Pop Proc
  627.   End 
  628. CHGBLOCK:
  629.   If X=19 or X=20 Then Gosub LADELEVEL
  630.   If X=22 or X=23 Then Gosub SPEICHERELEVEL
  631.   If X=25 Then LE=Min(LE+1,99) : Wait 13-M*4
  632.   If X=26 Then LE=Max(LE-1,51) : Wait 13-M*4
  633.   Screen 1 : Locate 19,0 : Print "LO SA +-  LEVEL:";LE;" ";
  634.   Locate 19,1 : Print "AD VE";
  635.   If X>17 Then Screen 0 : Return 
  636.   Put Cblock A+1,A*8,0
  637.   Box X*8,0 To X*8+7,15 : Screen 0 : A=X
  638. Return 
  639. LADELEVEL:
  640.   A$="Levels/"+Mid$(Str$(LE),2)
  641.   If Exist(A$)=0 Then X=26 : ALERT["No Level"+Str$(LE)+" on this disk!","It doesn't matter!","Shit!"] : Goto BLITZ
  642.   If LL=LE and CHG=0 Then ALERT["Level already loaded!","Aha!","Alles Banane?"] : Goto BLITZ
  643.   If CHG=1 Then ALERT["Last changes not saved!","Load it anyway","Ooops!"] : If Param=2 Then Goto BLITZ
  644.   Erase 6 : Reserve As Work 6,480
  645.   Bload "Levels/"+Mid$(Str$(LE),2),6
  646.   C=Start(6)
  647.   For XX=0 To 39
  648.     For YY=0 To 11
  649.       F=Peek(C) : Inc C : If F<>F(XX,YY) Then Put Cblock F+1,XX*8,YY*16
  650.       F(XX,YY)=F
  651.     Next 
  652.   Next 
  653.   LL=LE : Erase 6 : CHG=0
  654. Return 
  655. SPEICHERELEVEL:
  656.   If LL=LE and CHG=0 Then ALERT["No changes made!","I'll make some!","Sorry!"] : Goto BLITZ
  657.   A$="" : Poke $BFD100,$7D : Poke $BFD100,$75 : P=Peek($BFE001)
  658.   If(P and 12)<>12 Then ALERT["Disk is write protected!","I'll remove it!","Let it be!"] : If Param=1 Then Goto SPEICHERELEVEL Else Goto BLITZ
  659.   If Exist("Levels/"+Mid$(Str$(LE),2)) Then Gosub SURE : If Param=2 Then Return 
  660.   For XX=0 To 39
  661.     For YY=0 To 11
  662.       A$=A$+Chr$(F(XX,YY))
  663.     Next 
  664.   Next 
  665.   Bsave "Levels/"+Mid$(Str$(LE),2),Varptr(A$) To Varptr(A$)+480
  666.   CHG=0
  667. Return 
  668. SURE:
  669.   Erase 6 : Reserve As Work 6,480
  670.   Bload "Levels/"+Mid$(Str$(LE),2),6
  671.   C=Start(6)
  672.   For XX=0 To 39
  673.     For YY=0 To 11
  674.       F=Peek(C) : Inc C : If F<>F(XX,YY) Then Put Cblock F+1,XX*8,YY*16
  675.     Next 
  676.   Next 
  677.   ALERT["Level Exists already!!!","Kill it!","Forget it!"]
  678.   C=Start(6)
  679.   For XX=0 To 39
  680.     For YY=0 To 11
  681.       F=Peek(C) : Inc C : If F<>F(XX,YY) Then Put Cblock F(XX,YY)+1,XX*8,YY*16
  682.     Next 
  683.   Next 
  684. Return 
  685. BLITZ:
  686.   For C=1 To 15 : Colour C,$FFF : Next : Fade 1 To 1
  687. Return 
  688. End Proc
  689. Procedure ALERT[T$,YES$,NO$]
  690.   Hide 
  691.   Screen Open 2,320,40,8,0
  692.   Curs Off : Paper 0 : Flash Off : Cls 0
  693.   Palette 0,$F80,$F00,$F0,$FFF
  694.   Screen Display 2,128,-10,,
  695.   Flash 1,"(F80,50)(000,50)"
  696.   Ink 1 : Box 0,0 To 319,39 : Box 1,1 To 318,38
  697.   Box 2,2 To 317,37
  698.   Pen 4 : Locate 0,1 : Centre T$
  699.   Pen 3 : Locate 10-Len(YES$)/2,3 : Print YES$
  700.   Pen 2 : Locate 30-Len(NO$)/2,3 : Print NO$
  701.   For A=-10 To 40 Step 2
  702.     Wait Vbl : Screen Display 2,128,A,,
  703.   Next 
  704.   Repeat : M=Mouse Key : Until M
  705.   For A=40 To -10 Step -2
  706.     Wait Vbl : Screen Display 2,128,A,,
  707.   Next 
  708.   Screen Close 2 : Show 
  709. End Proc[M]
  710. Procedure MAIN
  711.   Load "Levels/NormLev.dat",15
  712.   Load "InGameSprites.dat",0
  713.   Load "InGame.sam",5
  714.   If Length(3)=0 : Load "InGame.mus",3 : End If 
  715.   Unpack 9 To 0
  716.   Screen Hide 0
  717.   For X=0 To 17
  718.     Get Cblock X+1,X*8,0,8,16
  719.   Next 
  720.   Screen Open 1,320,9,2,Lowres
  721.   Curs Off : Cls 0 : Palette 0,0
  722.   Print "BALLS: 05";At(12,);"SCORE: 0000000";At(30,);"LEVEL: 01";
  723.   Fade 1,0,$FFF : Wait 8
  724.   Screen Open 0,336,208,16,Lowres
  725.   Curs Off : Paper 0 : Flash Off : Cls 0
  726.   Screen Display 0,112,58,336,208
  727.   For X=0 To 41
  728.     For Y=0 To 12
  729.       F(X,Y)=99
  730.     Next 
  731.   Next 
  732.   Limit Mouse 128+300,59 To 128+300,230
  733.   A$=A$+"A: P; L X=X+R0; L Y=Y+R1; I X<128 J B; I X>448 J C; "
  734.   A$=A$+"F: I Y<66 J D; I Y>250 J E; J A; B: L X=128; L R0=0-R0; L R3=1; J F; "
  735.   A$=A$+"C: I R2=0 J A; L R3=2; J C; D: L Y=66; L R1=0-R1; L R3=1; J A; "
  736.   A$=A$+"E: L Y=250; L R1=0-R1; L R3=1; J A;"
  737.   Make Mask 
  738.   Sprite 4,0,0,1
  739.   Channel 1 To Sprite 4
  740.   Amal 1,A$
  741.   A$=""
  742.   A1$="A: P; L X=X+R0; L Y=Y+R1; I X<135 J B; I X>400 J C; F: I Y<72 J D; "
  743.   A1$=A1$+"I Y>250 J E; J A; B: L X=135; L R0=0-R0; J F; "
  744.   A1$=A1$+"C: L X=400; L R0=0-R0; J F; D: L Y=72; L R1=0-R1; J A; "
  745.   A1$=A1$+"E: L Y=250; L R1=0-R1; J A;"
  746.   A2$="A: P; I X<RA J H; I X>RA J I; J: I Y<RB J K; I Y>RB J L; G: I X<135 J B; "
  747.   A2$=A2$+"I X>400 J C; F: I Y<72 J D; I Y>250 J E; J A; H: L X=X+1; J J;"
  748.   A2$=A2$+"I: L X=X-1; J J; K: L Y=Y+1; J G; L: L Y=Y-1; J G; B: L X=135; J F; "
  749.   A2$=A2$+"C: L X=400; J F; D: L Y=72; J A; E: L Y=250; J A; "
  750.   Sprite 6,0,0,13
  751.   Channel 2 To Sprite 6
  752.   Amal 2,A1$
  753.   If RETEND=0 Then SC=0 : LE=LEV
  754.   SLE=LE
  755.   Amreg(2,0)=1 : Amreg(2,1)=1 : LED=0 : Volume 15,SV
  756.   C=0 : Gosub LADELEVEL : AN=8
  757.   If LE>25 Then Amal 2,A2$
  758.   NELI=SC/100000+1
  759.   If MU=1 Then Music 1 : Mvolume MV : Tempo 17
  760.   Ink 4 : Box 8,0 To 336,207 : Box 15,7 To 336,200
  761.   Ink 12 : Box 9,1 To 336,206 : Box 14,6 To 336,201
  762.   Ink 11 : Box 10,2 To 336,205 : Box 13,5 To 336,202
  763.   Ink 10 : Box 11,3 To 336,204 : Box 12,4 To 336,203
  764. NEWLIVE:
  765.   Amreg(1,2)=1 : KSP=0 : AN=8 : BAP=0 : AUT=0 : RX=-BSP : RY=BSP
  766.   Amreg(1,0)=RX : Amreg(1,1)=RY
  767.   U=3 : Gosub DISPLAY
  768.   Gosub NEWLIVE2
  769.   Amreg(1,2)=0 : Amreg(1,3)=0 : V=0 : Wait Vbl : Amreg(1,2)=1 : C=0
  770.   Amal On : MA=0 : MY=0
  771.   Do 
  772.     Wait Vbl : RX=Amreg(1,0) : RY=Amreg(1,1) : M=Mouse Key : Add BL,1,0 To 10
  773.     If AN<>Min(Max(AN+KSP,0),8) and SO=1 Then Play 8,24-(AN+KSP),0
  774.     If AUT=1 Then Y Mouse=Y Sprite(4)-12
  775.     A=F(Max(X Sprite(6)-128,0)/8,Max(Y Sprite(6)-65,0)/16)>0
  776.     If A and QC=0 Then Amreg(2,0)=-Amreg(2,0) : Amreg(2,1)=-Amreg(2,1) : QC=1
  777.     If A=0 Then QC=0
  778.     AN=Min(Max(AN+KSP,0),8) : U=0
  779.     MY=Max(Min(Y Mouse,222+AN),67-AN) : V=MA-MY
  780.     Amreg(0)=X Sprite(4) : Amreg(1)=Y Sprite(4)
  781.     X=Min((X Sprite(4)-124+RX)/8,39)
  782.     Y=Min((Y Sprite(4)-65+RY)/16,11)
  783.     Sprite 2,428,MY,2+AN : I$=Inkey$
  784.     F=F(X,Y) : GL=Max(GL-1,0)
  785.     If M=2 Then Gosub PAUSE
  786.     If M=1 Then AUT=0
  787.     If Amreg(1,3)=1 Then Inc SC : U=1 : Amreg(1,3)=0 : If SO Then Sam Play 2,1,5000+Rnd(2000)
  788.     Exit If Amreg(1,3)=2
  789.     A=Sprite Col(4,2 To 2) : If A and C=0 Then C=1 : Gosub BOUNCE
  790.     If A=0 Then C=0
  791.     A=Sprite Col(6,4 To 4) : If A and C2=0 Then Swap RX,RY : C2=Amreg(2,1) : Amreg(2,1)=Amreg(2,0) : Amreg(2,0)=C2 : C2=1 : If SO Then Sam Play 4,4,5000
  792.     If A=0 Then C2=0
  793.     If I$<>"" Then Gosub KEYS
  794.     If F>0 Then Gosub BLOCK
  795.     Amreg(1,0)=RX : Amreg(1,1)=RY
  796.     MA=MY : If ST<1 Then Exit 
  797.     If U Then Gosub DISPLAY
  798.   Loop 
  799.   Amreg(1,3)=0
  800.   If ST<>0
  801.     For A=AN To 8 : Sprite 2,428,MY,A+2 : Wait Vbl : Next 
  802.     If SO : Sam Play 4,3,5000 : End If 
  803.     For A=1 To 6 : Sprite 2,427,MY,A+18 : Wait Vbl : Wait Vbl : Next 
  804.     Sprite Off 2 : Wait 4
  805.   End If 
  806.   If ST>0 and LI>1 Then Dec LI : Gosub NORMAL : Goto NEWLIVE
  807.   If ST=0 and SO Then Sam Play 1,5,9000
  808.   If ST=0
  809.     Inc LI : Amal Freeze : Inc LE
  810.     If LE=51
  811.       Screen 1 : Fade 1 : Wait 16 : Screen 0 : Fade 1 : Wait 16
  812.       If MU=1
  813.         For A=MV To 0 Step -1 : Mvolume A : Wait Vbl : Next 
  814.       End If 
  815.       Amal Off : Sprite Off : Music Off 
  816.       Screen Close 0 : Screen Close 1 : Wait Vbl 
  817.       Erase 1 : Erase 5 : Erase 6
  818.       PP=805847 : Goto EXIPROC
  819.     End If 
  820.     If LE=100 : LE=1 : LI=5 : End If 
  821.     Wait Vbl : Gosub LADELEVEL
  822.     Goto NEWLIVE
  823.   End If 
  824.   Dec LI : U=3 : Gosub DISPLAY
  825.   Amal Off : Wait Vbl : Sprite Off 
  826.   Screen 0 : Double Buffer : X=-50 : RX=0
  827.   For A=-62 To 60 Step 3 : Y=A : Gosub GAMEOVER : Next 
  828.   Screen 1 : Fade 3
  829.   B=MV
  830.   For A=63 To 0 Step -1
  831.     B=Max(B-1,0) : If MU Then Mvolume B
  832.     Gosub GAMEOVER
  833.   Next 
  834.   Music Off 
  835.   For A=0 To 50 : Gosub GAMEOVER : Next 
  836.   Screen 0 : Fade 3
  837.   For A=60 To 200 Step 3 : Y=A : Gosub GAMEOVER : Next 
  838.   Wait Vbl : Screen Close 0 : Screen Close 1 : Wait Vbl 
  839.   Erase 1 : Erase 5 : Erase 6
  840.   PP=0
  841. Goto EXIPROC
  842. NORMAL:
  843.   Fade 3,,,,,,,,,,,,,,,,,,$124,$346,$457,$679,$89B,$9AC,$BCE,,,,,,,,
  844. Return 
  845. BAP:
  846.   Fade 3,,,,,,,,,,,,,,,,,,$412,$643,$754,$976,$B98,$CA9,$ECB,,,,,,,,
  847. Return 
  848. GAMEOVER:
  849.   X=X+RX : If X>0 Then Dec RX
  850.   If X<0 Then Inc RX
  851.   Bob 1,136+X/5,Y,12 : Wait Vbl 
  852. Return 
  853. BLOCK:
  854.   SX=(X Sprite(4)-124)*4 : SY=(Y Sprite(4)-61)*4
  855.   For A=0 To 3
  856.     SX=SX+RX
  857.     SY=SY+RY
  858.     If F(SX/32,SY/64)=0 Then AX=SX/32 : AY=SY/64
  859.   Next : F2=0
  860.   If F=17 Then AUT=1 : KSP=1 : BAP=0 : Gosub NORMAL
  861.   If F=16 Then LI=LI+1 : U=1 : KSP=1 : BAP=0 : AUT=0 : Gosub NORMAL : If SO Then Sam Play 4,5,8000
  862.   If F=15 Then KSP=1 : BAP=1 : AUT=0 : Gosub BAP
  863.   If F=14 Then KSP=-1 : BAP=0 : AUT=0 : Gosub NORMAL
  864.   If F=13 Then KSP=1 : BAP=0 : AUT=0 : F(39,BL)=12 : Put Cblock 13,328,BL*16+8 : F(39,BL+1)=12 : Put Cblock 13,328,BL*16+24 : Gosub NORMAL
  865.   If F>12 and F<18 and SO Then Sam Play 1,6,10000
  866.   If F=6 Then Add SC,100 : Inc U : F2=Rnd(4)+13 : Gosub RANDOM : If SO Then Sam Play 2,4,8500+Rnd(1000)
  867.   If F>6 and F<11 Then Add SC,100 : Inc U : F2=F+1 : Gosub RANDOM : If SO Then Sam Play 2,1,5000+Rnd(2000)
  868.   If F<6 or F=11 or F>12 Then Add SC,Min(F,5)*250 : Inc U : If SO Then Sam Play 2,2,7500+Rnd(1000)
  869.   If F<6 or F=11 Then Dec ST
  870.   If F=12 Then Add SC,2 : Inc U : F2=12 : If SO Then Sam Play 2,1,5000+Rnd(2000)
  871.   If AX<>X Then RX=-RX
  872.   If AY<>Y Then RY=-RY
  873.   F(X,Y)=F2 : Put Cblock F2+1,X*8+16,Y*16+8
  874. Return 
  875. PAUSE:
  876.   P=1 : Amal Freeze 
  877.   Bob 1,150,83,14 : Bob 2,142,108,18 : Bob 3,142,118,15
  878.   Bob 4,191,118,17-SO : Bob 5,191,108,17-MU : Wait Vbl 
  879.   MUA=MU : SOA=SO
  880.   Repeat 
  881.     Y Mouse=MY : I$=Inkey$ : Gosub KEYS
  882.     If Mouse Key=1 or ST=-1 Then P=0
  883.     If MUA<>MU Then MUA=MU : Bob 5,191,108,17-MU : Wait Vbl 
  884.     If SOA<>SO Then SOA=SO : Bob 4,191,118,17-SO : Wait Vbl 
  885.   Until P=0
  886.   Repeat : Until Mouse Key=0
  887.   Bob Off 
  888.   Amal On 
  889. Return 
  890. KEYS:
  891.   If I$="p" and P=1 Then P=0 : Return 
  892.   If I$="p" and P=0 Then Gosub PAUSE : Return 
  893.   If I$=Chr$(27) Then ST=-1 : Return 
  894.   If I$="s" and SO=0 Then SO=1 : Return 
  895.   If I$="s" and SO=1 Then SO=0 : Return 
  896.   If I$="m" and MU=1 Then MU=0 : Mvolume 0 : Return 
  897.   If I$="m" and MU=0 and Length(3)<>0 Then MU=1 : Mvolume MV : Return 
  898.   If I$="m" and MU=0 Then Amal Freeze : Load "InGame.mus",3 : Music 1 : Tempo TM : Mvolume MV : MU=1 : If P=0 Then Gosub PAUSE : Return 
  899.   If I$="n" Then MV=Max(MV-1,10) : If MU Then Mvolume MV : Return 
  900.   If I$="j" Then MV=Min(MV+1,63) : If MU Then Mvolume MV : Return 
  901.   If I$="a" and SV>25 Then Add SV,-2 : Volume 15,SV : Sam Play 2,1,5000 : Return 
  902.   If I$="w" and SV<63 Then Add SV,2 : Volume 15,SV : Sam Play 2,1,5000 : Return 
  903.   If I$="l" and LED=0 Then Led On : LED=1 : Return 
  904.   If I$="l" and LED=1 Then Led Off : LED=0 : Return 
  905.   If I$=Tab$ and PAL=1 Then Poke $DFF1DC,$20 : PAL=0 : Return 
  906.   If I$=Tab$ and PAL=0 Then Poke $DFF1DC,0 : PAL=1 : Return 
  907. Return 
  908. NEWLIVE2:
  909.   WAI=0 : Amal Freeze 1
  910.   If SO Then Sam Play 1,4,10000
  911.   Do 
  912.     MA=MY : M=Mouse Key
  913.     Wait Vbl : MY=Max(Min(Y Mouse,222+AN),67-AN) : Sprite 2,128+300,MY,2+AN
  914.     Sprite 4,128+292,MY+12,1 : Amreg(0)=X Sprite(4) : Amreg(1)=Y Sprite(4)
  915.     Inc WAI : If WAI>200 or M=1 or ST=-1 Then Exit 
  916.     I$=Inkey$ : If I$<>"" Then Gosub KEYS
  917.     If MA<>MY Then RY=Sgn(MY-MA)*Abs(RY) : Amreg(1,1)=RY
  918.     If M=2 Then Gosub PAUSE
  919.     A=F(Max(X Sprite(6)-128,0)/8,Max(Y Sprite(6)-65,0)/16)>0
  920.     If A and QC=0 Then Amreg(2,0)=-Amreg(2,0) : Amreg(2,1)=-Amreg(2,1) : QC=1
  921.     If A=0 Then QC=0
  922.   Loop 
  923.   MY=0 : MA=0 : Amal On 
  924.   If SO Then Sam Play 4,3,10000+Rnd(4000)
  925. Return 
  926. BOUNCE:
  927.   If RX<0 Then C=1 : Return 
  928.   If BAP=1 Then C=0 : Gosub NEWLIVE2
  929.   If SO=1 Then Sam Play 4,3,10000+Rnd(4000)
  930.   RX=-RX : C=1 : SC=SC+50 : U=1
  931.   RY=RY-Sgn(V) : If RY=0 Then RY=RY-Sgn(V)
  932.   RY=Min(Max(-5,RY),5)
  933. Return 
  934. LADELEVEL:
  935.   Fade 3
  936.   U=3 : Gosub DISPLAY
  937.   If LE=10 and SLE<>10 Then SHOACCESSCODE["XOBNAELC"]
  938.   If LE=20 and SLE<>20 Then SHOACCESSCODE["EMAGTSOL"]
  939.   If LE=30 and SLE<>30 Then SHOACCESSCODE["YOBOLLEH"]
  940.   If LE=40 and SLE<>40 Then SHOACCESSCODE["EMAGDOOG"]
  941.   If LE<51 Then Goto NORMALLEVELS
  942.   ST=0 : If Exist("Levels/"+Mid$(Str$(LE),2))=0 Then Add LE,1,1 To 99 : If LE=1 Then LI=5 : Goto LADELEVEL Else Goto LADELEVEL
  943.   Erase 7 : Reserve As Work 7,480
  944.   Bload "Levels/"+Mid$(Str$(LE),2),7
  945.   A=Start(7) : Wait 45
  946.   For X=0 To 39
  947.     For Y=0 To 11
  948.       F=Peek(A) : Inc A
  949.       If F<>F(X,Y) Then Put Cblock F+1,X*8+16,Y*16+8
  950.       F(X,Y)=F : If F>0 and F<12 and F<>6 Then Inc ST
  951.     Next 
  952.   Next 
  953.   Erase 7
  954. BACK:
  955.   For A=0 To 11
  956.     If F(0,A)=0 Then Sprite 6,0,A*16+58,13
  957.   Next 
  958.   Fade 3,0,$FFF,$E00,$800,$333,$F,$6,$D0,$40,$DDD,$BBB,$888,$666,$215,$42A,$63F,0,$124,$346,$457,$679,$89B,$9AC,$BCE,0,$444,$666,$777,$999,$BBB,$CCC,$EEE
  959. Return 
  960. NORMALLEVELS:
  961.   ST=0 : X=0 : Y=0 : D=Start(15)+Deek(Start(15)+((LE-1)*2)) : Wait 45
  962.   Do 
  963.     E=Peek(D) : F=E and 31 : Inc D
  964.     For A=0 To E/32
  965.       If F<>F(X,Y) Then Put Cblock F+1,X*8+16,Y*16+8
  966.       F(X,Y)=F
  967.       If F>0 and F<12 and F<>6 Then Inc ST
  968.       Inc Y
  969.       If Y>11 Then Y=0 : Inc X : If X>39 Then X=0 : Y=0 : Exit 2
  970.     Next 
  971.   Loop 
  972.   If LE=25 Then Amal 2,A2$
  973. Goto BACK
  974. RANDOM:
  975.   If AX<>X Then RX=-RX
  976.   If AY<>Y Then RY=-RY
  977. Return 
  978. DISPLAY:
  979.   If NELI*100000<SC Then Inc LI : Inc NELI : U=2 : If SO Then Sam Play 1,5,8000
  980.   Screen 1
  981.   If U>1 Then S$=Mid$(Str$(Min(LI,99)),2) : Print At(7,0);String$("0",2-Len(S$));S$;
  982.   S$=Mid$(Str$(SC),2)
  983.   Print At(19,0);String$("0",7-Len(S$));S$;
  984.   If U>2 Then S$=Mid$(Str$(LE),2) : Print At(37,0);String$("0",2-Len(S$));S$;
  985.   Screen 0
  986. Return 
  987. EXIPROC:
  988. End Proc[PP]
  989. Procedure SHOACCESSCODE[C$]
  990.   Wait 48
  991.   Screen Open 2,320,17,2,0
  992.   Curs Off 
  993.   Palette 0,0
  994.   Screen Display 2,128,0,320,16
  995.   Centre "WELL DONE! THE ACCESS CODE FOR" : Print 
  996.   Centre "THE NEXT LEVEL IS "+Flip$(C$)
  997.   Fade 3,0,$FFF
  998.   For A=20 To 140 Step 5
  999.     Screen Display 2,128,A,320,16
  1000.     Wait Vbl 
  1001.   Next 
  1002.   Wait 360
  1003.   For A=140 To 20 Step -5
  1004.     Screen Display 2,128,A,320,16
  1005.     Wait Vbl 
  1006.   Next 
  1007.   Screen Close 2
  1008. End Proc
  1009. Procedure ENGAME[CODE]
  1010.   If CODE<>805847 Then End 
  1011.   If Length(3) Then Bank Swap 3,15
  1012.   Load "End.dat",0
  1013.   Load "End.mus",3
  1014.   Load "End.sam",5
  1015.   SO=1 : MU=1
  1016.   Screen Open 0,320,200,8,0
  1017.   Paper 0 : Flash Off : Curs Off : Cls : Hide 
  1018.   Palette 0,0,0,0,0,0,0,0
  1019.   Global S,EX,I$
  1020.   A$=A$+"A: P; L X=X+R0; L Y=R1/5+Y; L R1=R1+1; "
  1021.   A$=A$+"   I Y>250 J B; "
  1022.   A$=A$+"   J A; "
  1023.   A$=A$+"B: L R2=0; P; I R2=1 J A; J B;"
  1024.   For N=0 To 13
  1025.     Sprite N+8,0,0,1 : Channel N To Sprite N+8 : Amal N,A$
  1026.   Next 
  1027.   Poke $DFF1DC,$20
  1028.   A$="A: F R0=0 To 36; N R0; L X=Z(255)+25; L Y=Z(127)+10; "
  1029.   A$=A$+" A 1,(2,3)(3,4)(4,20)(3,4)(2,3)(0,1); J A; "
  1030.   Bob 1,-10,-10,4 : Bob 2,-10,-10,4
  1031.   Channel 14 To Bob 2 : Channel 15 To Bob 1 : Amal 14,A$ : Amal 15,"PPPPPPPPPPPPP;"+A$
  1032.   For A=0 To 75
  1033.     X=Rnd(320) : Y=Rnd(170) : C=Rnd(2)+1
  1034.     Gosub STAR
  1035.   Next 
  1036.   Paper 0 : Pen 1 : Gr Writing 0 : Print 
  1037.   CT["WELL DONE!"] : Print : Print 
  1038.   CT["YOU HAVE COMPLETED ALL 50 LEVELS."] : Print : Print 
  1039.   CT["WE HOPE YOU ENJOYED PLAYING THIS GAME!"] : Print : Print 
  1040.   CT["HAVE YOU KNOWN: CHEATING IS BAD?"] : Print : Print : Print 
  1041.   CT["PRESS ESC TO ABORT GAME,"] : Print : Print 
  1042.   CT["F1 TO PLAY THE EDITOR LEVELS"] : Print : Print 
  1043.   CT["OR F2 TO RESTART AT LEVEL 1"] : Print : Print 
  1044.   CT["BUT MORE DIFFICULT!"]
  1045.   Double Buffer : Amal On 14 : Amal On 15 : Music 1
  1046.   Volume 30
  1047.   KSC=0 : I$="" : EX=0
  1048.   If MU Then Mvolume 63 Else Mvolume 0
  1049.   Fade 3,0,$444,$888,$FFF,0,$444,$888,$FFF : Led Off : COUNT=0
  1050.   Repeat 
  1051.     If COUNT<50 Then Gosub ROCKETS
  1052.     If COUNT=50 Then Gosub REINIT
  1053.     If COUNT>50 Then WAI[70] : Gosub FARBE
  1054.     Inc COUNT
  1055.   Until EX
  1056.   If KSC=80 Then LE=51 : BSP=4
  1057.   If KSC=81 Then LE=1 : BSP=5
  1058.   If MU=0 Then Music Off 
  1059.   Fade 4 : For A=63 To 0 Step -1 : Mvolume A : Wait Vbl : Next 
  1060.   Amal Off : Sprite Off : Bob Off : Music Off : Screen Close 0
  1061.   Erase 3 : Erase 1 : Erase 5
  1062.   If Length(15) Then Bank Swap 3,15
  1063.   PP=1 : RETEND=1 : Add LI,10
  1064.   If I$=Chr$(27) Then PP=0
  1065. Goto EXIPROC
  1066. ROCKETS:
  1067.   A=Rnd(24) : If SO Then Sam Raw 2,Start(5)+20,8000,9000-A*75
  1068.   SPR[0,159,190,Rnd(3)-2,-30-Rnd(13)]
  1069.   WAI[A+35] : If EX Then Return 
  1070.   If SO Then Sam Raw 2,Start(5)+8200,8500,8000
  1071.   X=X Sprite(8)-128 : Y=Y Sprite(8)-50 : Amal Freeze 0 : Sprite 8,0,0,3
  1072.   For A=1 To 13
  1073.     If Amreg(A,2)=0 Then SPR[A,X,Y,Rnd(5)-3,Rnd(29)-25]
  1074.   Next 
  1075. FARBE:
  1076.   C=Rnd(7) : If C=0 Then Fade 2,0,$444,$888,$FFF
  1077.   If C=1 Then Fade 2,0,$440,$880,$FF0
  1078.   If C=2 Then Fade 2,0,$400,$800,$F00
  1079.   If C=3 Then Fade 2,0,$40,$80,$F0
  1080.   If C=4 Then Fade 2,0,$404,$808,$F0F
  1081.   If C=5 Then Fade 2,0,$24,$48,$8F
  1082.   If C=6 Then Fade 2,0,$44,$88,$FF
  1083.   If C=7 Then Fade 2,0,$420,$840,$F80
  1084.   WAI[Rnd(19)+20]
  1085. Return 
  1086. REINIT:
  1087.   WAI[50]
  1088.   Amal Off : Wait Vbl : Sprite Off : Bob 1,-10,-10,4 : Bob 2,-10,-10,4
  1089.   Wait Vbl : Bob Off 
  1090.   For A=0 To 15
  1091.     Bob A,-10,-10,4
  1092.     Channel A To Bob A
  1093.     Amal A,String$("P",A*2)+";"+A$
  1094.   Next 
  1095.   Amal On 
  1096. Return 
  1097. STAR:
  1098.   Plot X,Y,C : Plot X-1,Y,Max(C-1,0) : Plot X+1,Y,Max(C-1,0)
  1099.   Plot X,Y-1,Max(C-1,0) : Plot X,Y+1,Max(C-1,0) : Plot X-2,Y,Max(C-2,0)
  1100.   Plot X+2,Y,Max(C-2,0) : Plot X,Y-2,Max(C-2,0) : Plot X,Y+2,Max(C-2,0)
  1101. Return 
  1102. EXIPROC:
  1103. End Proc[PP]
  1104. Procedure SPR[N,X,Y,SX,SY]
  1105.   R=Rnd(2)+2 : If N=0 Then R=3
  1106.   Amreg(N,2)=1 : Sprite N+8,X+128,Y+50,R : Amal On N : Amreg(N,0)=SX : Amreg(N,1)=SY
  1107. End Proc
  1108. Procedure WAI[T]
  1109.   If EX Then Pop Proc
  1110.   For A=1 To T
  1111.     Repeat 
  1112.       C=Rnd(4096) : R=C/256 : G=(C-R*256)/16 : B=C-R*256-G*16
  1113.     Until R+B+G>15
  1114.     D=Rnd(3)*4
  1115.     Colour 19+D,C : Colour 18+D,(R/2)*256+(G/2)*16+B/2 : Colour 17+D,(R/3)*256+(G/3)*16+B/3
  1116.     Wait Vbl : I$=Inkey$ : KSC=Scancode : If KSC=80 or KSC=81 or(I$=Chr$(27)) Then EX=1 : Exit 
  1117.     If I$="s" and SO=0 Then SO=1 : I$=""
  1118.     If I$="s" and SO Then SO=0
  1119.     If I$="m" and MU=0 Then MU=1 : I$="" : Mvolume 63
  1120.     If I$="m" and MU Then MU=0 : Mvolume 0
  1121.   Next 
  1122. End Proc
  1123. Procedure CT[T$]
  1124.   X=160-Len(T$)*4 : Y=Y Curs*8+2
  1125.   Ink 7,0 : Text X-1,Y-1,T$ : Text X,Y-1,T$ : Text X-1,Y,T$
  1126.   Ink 5 : Text X,Y+1,T$ : Text X+1,Y+1,T$ : Text X+1,Y,T$
  1127.   Ink 6 : Text X+1,Y-1,T$ : Text X-1,Y+1,T$ : Ink 0 : Text X,Y,T$
  1128. End Proc
  1129. Procedure ENTACCESSCODE
  1130.   Screen Open 1,320,200,2,0
  1131.   Curs Off : Flash Off : Paper 0 : Cls 0 : Pen 1
  1132.   Palette 0,$FFF,$FFF,$FFF
  1133.   Locate 1,10
  1134.   Centre "PLEASE ENTER LEVEL ACCESS CODE! "
  1135.   Screen Open 0,352,224,4,0
  1136.   Curs Off : Flash Off : Paper 0 : Cls 0
  1137.   Palette 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1138.   Screen Display 0,128,50,320,192
  1139.   SCROL$="L R0=0; L R1=0; A: L X=R0/14+305; P; L R0=R0+R1;"
  1140.   SCROL$=SCROL$+" I R0<70 J B; L R1=R1-1; J A; B: L R1=R1+1; J A; "
  1141.   Channel 1 To Screen Offset 1
  1142.   X=Free
  1143.   Amal 1,SCROL$
  1144.   For Y=0 To 13
  1145.     For X=0 To 22
  1146.       Ink 1+((X+Y) and 1) : Bar X*16,Y*16 To X*16+15,Y*16+15
  1147.     Next 
  1148.   Next 
  1149.   Dual Playfield 0,1 : Dual Priority 1,0
  1150.   Screen 1
  1151.   Ink 1 : Box 126,94 To 193,104
  1152.   Locate 16,12 : Print "--------"
  1153.   Screen 0
  1154.   Fade 3,0,$111,$222,0,0,0,0,0,0,$FFF
  1155.   Amal On 1
  1156.   C$=""
  1157.   CX=1 : CY=1 : CXS=2 : CYS=2 : CXT=0 : CYT=0
  1158.   Flash 1,"(111,95)(222,1)(333,1)(444,1)(333,1)(222,1)"
  1159.   Flash 2,"(222,95)(333,1)(444,1)(555,1)(444,1)(333,1)"
  1160.   Screen 1
  1161.   LEV=1
  1162.   Repeat 
  1163.     Wait Vbl 
  1164.     Screen Offset 0,CX,CY
  1165.     Add CX,CXS,1 To 31 : Add CY,CYS,1 To 31
  1166.     Inc CXT : Inc CYT
  1167.     If Rnd(50)=0 and CXT>30 Then CXS=-CXS : CXT=0
  1168.     If Rnd(50)=0 and CYT>30 Then CYS=-CYS : CYT=0
  1169.     A$=Upper$(Inkey$)
  1170.     If(A$>=" ") and(A$<="Z") and Len(C$)<8 Then C$=C$+A$
  1171.     If A$=Chr$(8) Then C$=Left$(C$,Len(C$)-1)
  1172.     If(A$<>Chr$(13)) and Len(C$)<8 Then P$=C$+"-" Else P$=C$
  1173.     Locate 16,12 : Print P$
  1174.   Until A$=Chr$(13)
  1175.   C$=Flip$(C$)
  1176.   If C$="XOBNAELC" Then LEV=10
  1177.   If C$="EMAGTSOL" Then LEV=20
  1178.   If C$="YOBOLLEH" Then LEV=30
  1179.   If C$="EMAGDOOG" Then LEV=40
  1180.   Screen 0 : Flash Off 
  1181.   Fade 3 : Wait 50 : Amal Off : Wait Vbl : Screen Close 1 : Screen Close 0
  1182. End Proc